home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / site-packages / impacket / dcerpc / ndrutils.py < prev    next >
Text File  |  2006-05-23  |  21KB  |  377 lines

  1. # Copyright (c) 2003-2006 CORE Security Technologies
  2. #
  3. # This software is provided under under a slightly modified version
  4. # of the Apache Software License. See the accompanying LICENSE file
  5. # for more information.
  6. #
  7. # $Id: ndrutils.py,v 1.7 2006/05/23 21:19:26 gera Exp $
  8. #
  9.  
  10. from struct import *
  11. import socket
  12. import random
  13. from impacket import uuid
  14.  
  15. def uuid_hex(_uuid):
  16.     for i in range(0,len(_uuid)):
  17.         print "\\0x%.2x"%unpack('<B',_uuid[i]),
  18.     print ""
  19.  
  20. def uuid_to_exe(_uuid):
  21.     KNOWN_UUIDS = { '\xb9\x99\x3f\x87\x4d\x1b\x10\x99\xb7\xaa\x00\x04\x00\x7f\x07\x01\x00\x00': 'ssmsrp70.dll',
  22.                     '\x90\x2c\xfe\x98\x42\xa5\xd0\x11\xa4\xef\x00\xa0\xc9\x06\x29\x10\x01\x00':'advapi32.dll',
  23.                     '\x44\xaf\x7d\x8c\xdc\xb6\xd1\x11\x9a\x4c\x00\x20\xaf\x6e\x7c\x57\x01\x00':'appmgmts.dll',
  24.                     '\xc0\xeb\x4f\xfa\x91\x45\xce\x11\x95\xe5\x00\xaa\x00\x51\xe5\x10\x04\x00':'autmgr32.exe',
  25.                     '\xe0\x42\xc7\x4f\x10\x4a\xcf\x11\x82\x73\x00\xaa\x00\x4a\xe6\x73\x03\x00':'dfssvc.exe',
  26.                     '\x98\xd0\xff\x6b\x12\xa1\x10\x36\x98\x33\x46\xc3\xf8\x74\x53\x2d\x01\x00':'DHCPSSVC.DLL',
  27.                     '\x20\x17\x82\x5b\x3b\xf6\xd0\x11\xaa\xd2\x00\xc0\x4f\xc3\x24\xdb\x01\x00':'DHCPSSVC.DLL',
  28.                     '\xfa\x9d\xd7\xd2\x00\x34\xd0\x11\xb4\x0b\x00\xaa\x00\x5f\xf5\x86\x01\x00':'dmadmin.exe',
  29.                     '\xa4\xc2\xab\x50\x4d\x57\xb3\x40\x9d\x66\xee\x4f\xd5\xfb\xa0\x76\x05\x00':'dns.exe',
  30.                     '\x90\x38\xa9\x65\xb9\xfa\xa3\x43\xb2\xa5\x1e\x33\x0a\xc2\x8f\x11\x02\x00':'dnsrslvr.dll',
  31.                     '\x65\x31\x0a\xea\x34\x48\xd2\x11\xa6\xf8\x00\xc0\x4f\xa3\x46\xcc\x04\x00':'faxsvc.exe',
  32.                     '\x64\x1d\x82\x0c\xfc\xa3\xd1\x11\xbb\x7a\x00\x80\xc7\x5e\x4e\xc1\x01\x00':'irftp.exe',
  33.                     '\xd0\xbb\xf5\x7a\x63\x60\xd1\x11\xae\x2a\x00\x80\xc7\x5e\x4e\xc1\x00\x00':'irmon.dll',
  34.                     '\x40\xb2\x9b\x20\x19\xb9\xd1\x11\xbb\xb6\x00\x80\xc7\x5e\x4e\xc1\x01\x00':'irmon.dll',
  35.                     '\xfb\xee\x0c\x13\x66\xe4\xd1\x11\xb7\x8b\x00\xc0\x4f\xa3\x28\x83\x02\x00':'ismip.dll',
  36.                     '\x86\xd4\xdc\x68\x9e\x66\xd1\x11\xab\x0c\x00\xc0\x4f\xc2\xdc\xd2\x01\x00':'ismserv.exe',
  37.                     '\x40\xfd\x2c\x34\x6c\x3c\xce\x11\xa8\x93\x08\x00\x2b\x2e\x9c\x6d\x00\x00':'llssrv.exe',
  38.                     '\xd0\x4c\x67\x57\x00\x52\xce\x11\xa8\x97\x08\x00\x2b\x2e\x9c\x6d\x01\x00':'llssrv.exe',
  39.                     '\xc4\x0c\x3c\xe3\x82\x04\x1a\x10\xbc\x0c\x02\x60\x8c\x6b\xa2\x18\x01\x00':'locator.exe',
  40.                     '\xf0\x0e\xd7\xd6\x3b\x0e\xcb\x11\xac\xc3\x08\x00\x2b\x1d\x29\xc3\x01\x00':'locator.exe',
  41.                     '\x14\xb5\xfb\xd3\x3b\x0e\xcb\x11\x8f\xad\x08\x00\x2b\x1d\x29\xc3\x01\x00':'locator.exe',
  42.                     '\xf0\x0e\xd7\xd6\x3b\x0e\xcb\x11\xac\xc3\x08\x00\x2b\x1d\x29\xc4\x01\x00':'locator.exe',
  43.                     '\x78\x57\x34\x12\x34\x12\xcd\xab\xef\x00\x01\x23\x45\x67\x89\xab\x00\x00':'lsasrv.dll',
  44.                     '\x88\xd4\x81\xc6\x50\xd8\xd0\x11\x8c\x52\x00\xc0\x4f\xd9\x0f\x7e\x01\x00':'lsasrv.dll',
  45.                     '\xf0\x09\x8f\xed\xb7\xce\x11\xbb\xd2\x00\x00\x1a\x18\x1c\xad\x00\x00\x00':'mprdim.dll',
  46.                     '\xe0\xca\x02\xec\xe0\xb9\xd2\x11\xbe\x62\x00\x20\xaf\xed\xdf\x63\x01\x00':'mq1repl.dll',
  47.                     '\x80\x7a\xdf\x77\x98\xf2\xd0\x11\x83\x58\x00\xa0\x24\xc4\x80\xa8\x01\x00':'mdqssrv.dll',
  48.                     '\x10\xca\x8c\x70\x69\x95\xd1\x11\xb2\xa5\x00\x60\x97\x7d\x81\x18\x01\x00':'mqdssrv.dll',
  49.                     '\x80\x35\x5b\x5b\xe0\xb0\xd1\x11\xb9\x2d\x00\x60\x08\x1e\x87\xf0\x01\x00':'mqqm.dll',
  50.                     '\xe0\x8e\x20\x41\x70\xe9\xd1\x11\x9b\x9e\x00\xe0\x2c\x06\x4c\x39\x01\x00':'mqqm.dll',
  51.                     '\x80\xa9\x88\x10\xe5\xea\xd0\x11\x8d\x9b\x00\xa0\x24\x53\xc3\x37\x01\x00':'mqqm.dll',
  52.                     '\xe0\x0c\x6b\x90\x0b\xc7\x67\x10\xb3\x17\x00\xdd\x01\x06\x62\xda\x01\x00':'msdtcprx.dll',
  53.                     '\xf8\x91\x7b\x5a\x00\xff\xd0\x11\xa9\xb2\x00\xc0\x4f\xb6\x36\xfc\x01\x00':'msgsvc.dll',
  54.                     '\x82\x06\xf7\x1f\x51\x0a\xe8\x30\x07\x6d\x74\x0b\xe8\xce\xe9\x8b\x01\x00':'mstask.exe',
  55.                     '\xb0\x52\x8e\x37\xa9\xc0\xcf\x11\x82\x2d\x00\xaa\x00\x51\xe4\x0f\x01\x00':'mstask.exe',
  56.                     '\x20\x32\x5f\x2f\x26\xc1\x76\x10\xb5\x49\x07\x4d\x07\x86\x19\xda\x01\x00':'netdde.exe',
  57.                     '\x78\x56\x34\x12\x34\x12\xcd\xab\xef\x00\x01\x23\x45\x67\xcf\xfb\x01\x00':'netlogon.dll',
  58.                     '\x18\x5a\xcc\xf5\x64\x42\x1a\x10\x8c\x59\x08\x00\x2b\x2f\x84\x26\x38\x00':'ntdsa.dll',
  59.                     '\x7c\x5a\xcc\xf5\x64\x42\x1a\x10\x8c\x59\x08\x00\x2b\x2f\x84\x26\x15\x00':'ntdsa.dll',
  60.                     '\x35\x42\x51\xe3\x06\x4b\xd1\x11\xab\x04\x00\xc0\x4f\xc2\xdc\xd2\x04\x00':'ntdsa.dll',
  61.                     '\x70\x0d\xec\xec\x03\xa6\xd0\x11\x96\xb1\x00\xa0\xc9\x1e\xce\x30\x01\x00':'ntdsbsrv.dll',
  62.                     '\x3a\xcf\xe0\x16\x04\xa6\xd0\x11\x96\xb1\x00\xa0\xc9\x1e\xce\x30\x01\x00':'ntdsbsrv.dll',
  63.                     '\xb4\x59\xcc\xf5\x64\x42\x1a\x10\x8c\x59\x08\x00\x2b\x2f\x84\x26\x01\x00':'ntfrs.exe',
  64.                     '\x86\xb1\x49\xd0\x4f\x81\xd1\x11\x9a\x3c\x00\xc0\x4f\xc9\xb2\x32\x01\x00':'ntfrs.exe',
  65.                     '\x1c\x02\x0c\xa0\xe2\x2b\xd2\x11\xb6\x78\x00\x00\xf8\x7a\x8f\x8e\x01\x00':'ntfrs.exe',
  66.                     '\xa0\x9e\xc0\x69\x09\x4a\x1b\x10\xae\x4b\x08\x00\x2b\x34\x9a\x02\x00\x00':'ole32.dll',
  67.                     '\x50\x38\xcd\x15\xca\x28\xce\x11\xa4\xe8\x00\xaa\x00\x61\x16\xcb\x01\x00':'pgpsdkserv.exe',
  68.                     '\xf6\xb8\x35\xd3\x31\xcb\xd0\x11\xb0\xf9\x00\x60\x97\xba\x4e\x54\x01\x00':'polagent.dll',
  69.                     '\xf0\xe4\x9c\x36\xdc\x0f\xd3\x11\xbd\xe8\x00\xc0\x4f\x8e\xee\x78\x01\x00':'profmap.dll',
  70.                     '\x36\x00\x61\x20\x22\xfa\xcf\x11\x98\x23\x00\xa0\xc9\x11\xe5\xdf\x01\x00':'rasmans.dll',
  71.                     '\x01\xd0\x8c\x33\x44\x22\xf1\x31\xaa\xaa\x90\x00\x38\x00\x10\x03\x01\x00':'regsvc.exe',
  72.                     '\x83\xaf\xe1\x1f\x5d\xc9\x11\x91\xa4\x08\x00\x2b\x14\xa0\xfa\x03\x00\x00':'rpcss.dll',
  73.                     '\x84\x65\x0a\x0b\x0f\x9e\xcf\x11\xa3\xcf\x00\x80\x5f\x68\xcb\x1b\x01\x00':'rpcss.dll',
  74.                     '\xb0\x01\x52\x97\xca\x59\xd0\x11\xa8\xd5\x00\xa0\xc9\x0d\x80\x51\x01\x00':'rpcss.dll',
  75.                     '\xe6\x73\x0c\xe6\xf9\x88\xcf\x11\x9a\xf1\x00\x20\xaf\x6e\x72\xf4\x02\x00':'rpcss.dll',
  76.                     '\xc4\xfe\xfc\x99\x60\x52\x1b\x10\xbb\xcb\x00\xaa\x00\x21\x34\x7a\x00\x00':'rpcss.dll',
  77.                     '\x1e\x24\x2f\x41\x2a\xc1\xce\x11\xab\xff\x00\x20\xaf\x6e\x7a\x17\x00\x00':'rpcss.dll',
  78.                     '\x36\x01\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x46\x00\x00':'rpcss.dll',
  79.                     '\x72\xee\xf3\xc6\x7e\xce\xd1\x11\xb7\x1e\x00\xc0\x4f\xc3\x11\x1a\x01\x00':'rpcss.dll',
  80.                     '\xb8\x4a\x9f\x4d\x1c\x7d\xcf\x11\x86\x1e\x00\x20\xaf\x6e\x7c\x57\x00\x00':'rpcss.dll',
  81.                     '\xa0\x01\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00x\00x\00\x46\x00\x00':'rpcss.dll',
  82.                     '\x60\x9e\xe7\xb9\x52\x3d\xce\x11\xaa\xa1\x00\x00\x69\x01\x29\x3f\x00\x00':'rpcss.dll',
  83.                     '\x78\x57\x34\x12\x34\x12\xcd\xab\xef\x00\x01\x23\x45\x67\x89\xac\x01\x00':'samsrv.dll',
  84.                     '\xa2\x9c\x14\x93\x3b\x97\xd1\x11\x8c\x39\x00\xc0\x4f\xb9\x84\xf9\x00\x00':'scesrv.dll',
  85.                     '\x24\xe4\xfb\x63\x29\x20\xd1\x11\x8d\xb8\x00\xaa\x00\x4a\xbd\x5e\x01\x00':'sens.dll',
  86.                     '\x66\x9f\x9b\x62\x6c\x55\xd1\x11\x8d\xd2\x00\xaa\x00\x4a\xbd\x5e\x02\x00':'sens.dll',
  87.                     '\x81\xbb\x7a\x36\x44\x98\xf1\x35\xad\x32\x98\xf0\x38\x00\x10\x03\x02\x00':'services.exe',
  88.                     '\x7c\xda\x83\x4f\xe8\xd2\x11\x98\x07\x00\xc0\x4f\x8e\xc8\x50\x02\x00\x00':'sfc.dll',
  89.                     '\xc8\x4f\x32\x4b\x70\x16\xd3\x01\x12\x78\x5a\x47\xbf\x6e\xe1\x88\x00\x00':'sfmsvc.exe',
  90.                     '\x78\x56\x34\x12\x34\x12\xcd\xab\xef\x00\x01\x23\x45\x67\x89\xab\x01\x00':'spoolsv.exe',
  91.                     '\xe0\x6d\x7a\x8c\x8d\x78\xd0\x11\x9e\xdf\x44\x45\x53\x54\x00\x00\x02\x00':'stisvc.exe',
  92.                     '\x20\x65\x5f\x2f\x46\xca\x67\x10\xb3\x19\x00\xdd\x01\x06\x62\xda\x01\x00':'tapisrv.dll',
  93.                     '\x60\xa7\xa4\x5c\xb1\xeb\xcf\x11\x86\x11\x00\xa0\x24\x54\x20\xed\x01\x00':'termsrv.exe',
  94.                     '\x22\xc4\xa1\x4d\x3d\x94\xd1\x11\xac\xae\x00\xc0\x4f\xc2\xaa\x3f\x01\x00':'trksvr.dll',
  95.                     '\x32\x35\x0f\x30\xcc\x38\xd0\x11\xa3\xf0\x00\x20\xaf\x6b\x0a\xdd\x01\x00':'trkwks.dll',
  96.                     '\x12\xfc\x99\x60\xff\x3e\xd0\x11\xab\xd0\x00\xc0\x4f\xd9\x1a\x4e\x03\x00':'winfax.dll',
  97.                     '\xc0\xe0\x4d\x89\x55\x0d\xd3\x11\xa3\x22\x00\xc0\x4f\xa3\x21\xa1\x01\x00':'winlogon.exe',
  98.                     '\x28\x2c\xf5\x45\x9f\x7f\x1a\x10\xb5\x2b\x08\x00\x2b\x2e\xfa\xbe\x01\x00':'wins.exe',
  99.                     '\xbf\x09\x11\x81\xe1\xa4\xd1\x11\xab\x54\x00\xa0\xc9\x1e\x9b\x45\x01\x00':'wins.exe',
  100.                     '\xa0\xb3\x02\xa0\xb7\xc9\xd1\x11\xae\x88\x00\x80\xc7\x5e\x4e\xc1\x01\x00':'wlnotify.dll',
  101.                     '\xd1\x51\xa9\xbf\x0e\x2f\xd3\x11\xbf\xd1\x00\xc0\x4f\xa3\x49\x0a\x01\x00':'aqueue.dll',
  102.                     '\x80x\42\xad\x82\x6b\x03\xcf\x11\x97\x2c\x00\xaa\x00\x68\x87\xb0\x02\x00':'infocomm.dll',
  103.                     '\x70\x5d\xfb\x8c\xa4\x31\xcf\x11\xa7\xd8\x00\x80\x5f\x48\xa1\x35\x03\x00':'smtpsvc.dll',
  104.                     '\x80\x42\xad\x82\x6b\x03\xcf\x11\x97\x2c\x00\xaa\x00\x68\x87\xb0\x02\x00':'infoadmn.dll',
  105.                     '\x00\xb9\x99\x3f\x87\x4d\x1b\x10\x99\xb7\xaa\x00\x04\x00\x7f\x07\x01\x00':'ssmsrpc.dll - Microsoft SQL Server',
  106.                     '\x60\xf4\x82\x4f\x21\x0e\xcf\x11\x90\x9e\x00\x80\x5f\x48\xa1\x35\x04\x00':'nntpsvc.dll',
  107.                     '\xc0\x47\xdf\xb3\x5a\xa9\xcf\x11\xaa\x26\x00\xaa\x00\xc1\x48\xb9\x09\x00':'mspadmin.exe - Microsoft ISA Server',
  108.                     '\x1f\xa7\x37\x21\x5e\xbb\x29\x4e\x8e\x7e\x2e\x46\xa6\x68\x1d\xbf\x09\x00':'wspsrv.exe - Microsoft ISA Server',
  109.                     '\xf8\x91\x7b\x5a\x00\xff\xd0\x11\xa9\xb2\x00\xc0\x4f\xb6\xe6\xfc\x01\x00':'msgsvc.dll'
  110.         }
  111.     if KNOWN_UUIDS.has_key(_uuid):
  112.         return KNOWN_UUIDS[_uuid]
  113.     else:
  114.         return 'unknown'
  115.  
  116. #Protocol ids, reference: http://www.opengroup.org/onlinepubs/9629399/apdxi.htm
  117. class NDRFloor:
  118.     PROTO_ID = { 0x0: 'OSI OID',
  119.                  0x2: 'UUID',
  120.                  0x5: 'OSI TP4',
  121.                  0x6: 'OSI CLNS or DNA Routing',
  122.                  0x7: 'DOD TCP',
  123.                  0x8: 'DOD UDP',
  124.                  0x9: 'DOD IP',
  125.                  0xa: 'RPC connectionless protocol',
  126.                  0xb: 'RPC connection-oriented protocol',
  127.                  0xd: 'UUID',
  128.                  0x2: 'DNA Session Control',
  129.                  0x3: 'DNA Session Control V3',
  130.                  0x4: 'DNA NSP Transport',
  131.                  0x0d: 'Netware SPX', 
  132.                  0x0e: 'Netware IPX', #someone read hexa as decimal? (0xe=0x14 in opengroup's list)
  133.                  0x0f: 'Named Pipes',
  134.                  0x10: 'Named Pipes',
  135.                  0x11: 'NetBIOS',
  136.                  0x12: 'NetBEUI',
  137.                  0x13: 'Netware SPX',
  138.                  0x14: 'Netware IPX',
  139.                  0x16: 'Appletalk Stream',
  140.                  0x17: 'Appletalk Datagram',
  141.                  0x18: 'Appletalk',
  142.                  0x19: 'NetBIOS',
  143.                  0x1a: 'Vines SPP',
  144.                  0x1b: 'Vines IPC',
  145.                  0x1c: 'StreeTalk',
  146.                  0x20: 'Unix Domain Socket',
  147.                  0x21: 'null',
  148.                  0x22: 'NetBIOS'}
  149.                  
  150.     def __init__(self,data=''):
  151.         self._lhs_len = 0
  152.         self._protocol = 0
  153.         self._uuid = ''
  154.         self._rhs_len = 0
  155.         self._rhs = ''
  156.         self._floor_len = 0
  157.         if data != 0:
  158.             self._lhs_len, self._protocol = unpack('<HB',data[:3])
  159.             offset = 3
  160.             if self._protocol == 0x0d: # UUID
  161.                 self._uuid = data[offset:offset+self._lhs_len-1]
  162.                 offset += self._lhs_len-1
  163.             self._rhs_len = unpack('<H',data[offset:offset+2])[0]
  164.             offset += 2
  165.             self._rhs = data[offset:offset+self._rhs_len]
  166.             self._floor_len = offset + self._rhs_len
  167.                                                
  168.     def get_floor_len(self):
  169.         return self._floor_len
  170.     def get_protocol(self):
  171.         return self._protocol
  172.     def get_rhs(self):
  173.         return self._rhs
  174.     def get_rhs_len(self):
  175.         return self._rhs_len
  176.     def get_uuid(self):
  177.         return self._uuid
  178.     def get_protocol_string(self):
  179.         if NDRFloor.PROTO_ID.has_key(self._protocol):
  180.             return NDRFloor.PROTO_ID[self._protocol]
  181.         else:
  182.             return 'unknown'
  183.     def get_uuid_string(self):
  184.         if len(self._uuid) == 18:
  185.             version = unpack('<H',self._uuid[16:18])[0]
  186.             return "%s version: %d" % (parse_uuid(self._uuid), version)
  187.         else:
  188.             return ''
  189.  
  190. def parse_uuid(_uuid):
  191.     return uuid.bin_to_string(_uuid)
  192.  
  193. class NDRTower:
  194.     def __init__(self,data=''):
  195.         self._length = 0
  196.         self._length2 = 0
  197.         self._number_of_floors = 0
  198.         self._floors = []
  199.         self._tower_len = 0
  200.         if data != 0:
  201.             self._length, self._length2, self._number_of_floors = unpack('<LLH',data[:10])
  202.             offset = 10
  203.             for i in range(0,self._number_of_floors):
  204.                 self._floors.append(NDRFloor(data[offset:]))
  205.                 offset += self._floors[i].get_floor_len()
  206.             self._tower_len = offset
  207.     def get_tower_len(self):
  208.         return self._tower_len
  209.     def get_floors(self):
  210.         return self._floors
  211.     def get_number_of_floors(self):
  212.         return self._number_of_floors
  213.     
  214.                                     
  215. class NDREntry:
  216.     def __init__(self,data=''):
  217.         self._objectid = ''
  218.         self._entry_len = 0
  219.         self._tower = 0
  220.         self._referent_id = 0
  221.         self._annotation_offset = 0
  222.         self._annotation_len = 0
  223.         self._annotation = ''
  224.         if data != 0:
  225.             self._objectid = data[:16]
  226.             self._referent_id = unpack('<L',data[16:20])[0]
  227.             self._annotation_offset, self._annotation_len = unpack('<LL',data[20:28])
  228.             self._annotation = data[28:28+self._annotation_len-1]
  229.             if self._annotation_len % 4:
  230.                 self._annotation_len += 4 - (self._annotation_len % 4)
  231.             offset = 28 + self._annotation_len
  232.             self._tower = NDRTower(data[offset:])
  233.             self._entry_len = offset + self._tower.get_tower_len()
  234.     def get_entry_len(self):
  235.         if self._entry_len % 4:
  236.             self._entry_len += 4 - (self._entry_len % 4)
  237.         return self._entry_len
  238.     def get_annotation(self):
  239.         return self._annotation
  240.     def get_tower(self):
  241.         return self._tower
  242.  
  243.     def get_uuid(self):
  244.         binuuid = self._tower.get_floors()[0].get_uuid()
  245.         return binuuid[:16]
  246.  
  247.     def get_objuuid(self):
  248.         return self._objectid
  249.  
  250.     def get_version(self):
  251.         binuuid = self._tower.get_floors()[0].get_uuid()
  252.         return unpack('<H', binuuid[16:18])[0]
  253.  
  254.     def print_friendly(self):
  255.         if self._tower <> 0:
  256.             floors = self._tower.get_floors()
  257.             print "IfId: %s [%s]" % (floors[0].get_uuid_string(), uuid_to_exe(floors[0].get_uuid()))
  258.             if self._annotation:
  259.                 print "Annotation: %s" % self._annotation
  260.             print "UUID: %s" % parse_uuid(self._objectid)
  261.             print "Binding: %s" % self.get_string_binding()
  262.             print ''
  263.  
  264.     def get_string_binding(self):
  265.         if self._tower <> 0:
  266.             tmp_address = ''
  267.             tmp_address2 = ''
  268.             floors = self._tower.get_floors()
  269.             num_floors = self._tower.get_number_of_floors()
  270.             for i in range(3,num_floors):
  271.                 if floors[i].get_protocol() == 0x07:
  272.                     tmp_address = 'ncacn_ip_tcp:%%s[%d]' % unpack('!H',floors[i].get_rhs())
  273.                 elif floors[i].get_protocol() == 0x08:
  274.                     tmp_address = 'ncadg_ip_udp:%%s[%d]' % unpack('!H',floors[i].get_rhs())
  275.                 elif floors[i].get_protocol() == 0x09:
  276.                     # If the address were 0.0.0.0 it would have to be replaced by the remote host's IP.
  277.                     tmp_address2 = socket.inet_ntoa(floors[i].get_rhs())
  278.                     if tmp_address <> '':
  279.                         return tmp_address % tmp_address2
  280.                     else:
  281.                         return 'IP: %s' % tmp_address2
  282.                 elif floors[i].get_protocol() == 0x0c:
  283.                     tmp_address = 'ncacn_spx:~%%s[%d]' % unpack('!H',floors[i].get_rhs())
  284.                 elif floors[i].get_protocol() == 0x0d:
  285.                     n = floors[i].get_rhs_len()
  286.                     tmp_address2 = ('%02X' * n) % unpack("%dB" % n, floors[i].get_rhs())
  287.                     if tmp_address <> '':
  288.                         return tmp_address % tmp_address2
  289.                     else:
  290.                         return 'SPX: %s' % tmp_address2
  291.                 elif floors[i].get_protocol() == 0x0e:
  292.                     tmp_address = 'ncadg_ipx:~%%s[%d]' % unpack('!H',floors[i].get_rhs())
  293.                 elif floors[i].get_protocol() == 0x0f:
  294.                     tmp_address = 'ncacn_np:%%s[%s]' % floors[i].get_rhs()[:floors[i].get_rhs_len()-1]
  295.                 elif floors[i].get_protocol() == 0x10:
  296.                     return 'ncalrpc:[%s]' % floors[i].get_rhs()[:floors[i].get_rhs_len()-1]
  297.                 elif floors[i].get_protocol() == 0x01 or floors[i].get_protocol() == 0x11:
  298.                     if tmp_address <> '':
  299.                         return tmp_address % floors[i].get_rhs()[:floors[i].get_rhs_len()-1]
  300.                     else:
  301.                         return 'NetBIOS: %s' % floors[i].get_rhs()
  302.                 elif floors[i].get_protocol() == 0x1f:
  303.                     tmp_address = 'ncacn_http:%%s[%d]' % unpack('!H',floors[i].get_rhs())
  304.                 else:
  305.                     if floors[i].get_protocol_string() == 'unknown':
  306.                         return 'unknown_proto_0x%x:[0]' % floors[i].get_protocol()
  307.                     elif floors[i].get_protocol_string() <> 'UUID':
  308.                         return 'protocol: %s, value: %s' % (floors[i].get_protocol_string(), floors[i].get_rhs())
  309.  
  310.  
  311. class NDREntries:
  312.     def __init__(self,data=''):
  313.         self._max_count = 0
  314.         self._offset = 0
  315.         self._actual_count = 0
  316.         self._entries_len = 0
  317.         self._entries = []
  318.         if data != 0:
  319.             self._max_count, self._offset, self._actual_count = unpack('<LLL',data[:12])
  320.             self._entries_len = 12
  321.             for i in range (0,self._actual_count):
  322.                 self._entries.append(NDREntry(data[self._entries_len:]))
  323.                 self._entries_len += self._entries[i].get_entry_len()
  324.                 
  325.     def get_max_count(self):
  326.         return self._max_count
  327.     def get_offset(self):
  328.         return self._offset
  329.     def get_actual_count(self):
  330.         return self._actual_count
  331.     def get_entries_len(self):
  332.         return self._entries_len
  333.     def get_entry(self):
  334.         return self._entries[0]
  335.     
  336. class NDRPointer:
  337.     def __init__(self,data='',pointerType = None):
  338.         self._referent_id = random.randint(0,65535)
  339.         self._pointer = None
  340.         if data != '':
  341.             self._referent_id = unpack('<L',data[:4])[0]
  342.             self._pointer = pointerType(data[4:])
  343.     def set_pointer(self, data):
  344.         self._pointer = data
  345.     def get_pointer(self):
  346.         return self._pointer
  347.     def rawData(self):
  348.         return pack('<L',self._referent_id) + self._pointer.rawData()
  349.  
  350. class NDRString:
  351.     def __init__(self,data=''):
  352.         self._string = ''
  353.         self._max_len = 0
  354.         self._offset = 0
  355.         self._length = 0
  356.         if data != '':
  357.             self._max_len, self._offset, self._length = unpack('<LLL',data[:12])
  358.             self._string = unicode(data[12:12 + self._length * 2], 'utf-16le')
  359.     def get_string(self):
  360.         return self._string
  361.     def set_string(self,str):
  362.         self._string = str
  363.         self._max_len = self._length = len(str)+1
  364.     def rawData(self):
  365.         if self._length & 0x1:
  366.             self._tail = pack('<HH',0,0)
  367.         else:
  368.             self._tail = pack('<H',0)
  369.         return pack('<LLL',self._max_len, self._offset, self._length) + self._string.encode('utf-16le') + self._tail
  370.  
  371.     def get_max_len(self):
  372.         return self._max_len
  373.  
  374.     def get_length(self):
  375.         return self._length
  376.     
  377.